
package com.myapp.dao;

import com.myapp.model.Empleados;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
import javax.persistence.Query;

@Stateless
public class EmpleadoDAO implements EmpleadoDAOLocal {

    @PersistenceContext(unitName = "CRUDWebApplicationModifPU", type = PersistenceContextType.TRANSACTION)
    private EntityManager emTeruel;
    @PersistenceContext(unitName = "CRUDWebApplicationModifPUSoria", type = PersistenceContextType.TRANSACTION)
    private EntityManager emSoria;

    @Override
    public boolean addEmpleado(Empleados empleado) {
        // se añade un empleado bien en BBDD de Soria o Teruel
        if (!empleado.getDNI().equals("")) { //si el campo de DNI no es vacío
            if (getEmpleado(empleado.getDNI()) == null) {//si no hay ya un empleado con ese DNI
                if (empleado.getSucursal().equalsIgnoreCase("teruel")) { // se añade en Teruel
                    emTeruel.persist(empleado);
                } else { //se añade en Soria
                    emSoria.persist(empleado);
                }
            return true;
            }
            
        }
        return false;
    }

    @Override
    public boolean editEmpleado(Empleados empleado) {
        // se permite la opción de editar los datos de los empleados tanto de Soria como Teruel
        Empleados em = getEmpleado(empleado.getDNI());
        if (em != null) {
            if (empleado.getSucursal().equalsIgnoreCase("teruel")) {
                emTeruel.merge(empleado);
            } else {
                emSoria.merge(empleado);
            }
            return true;
        } else {
            return false;
        }
    }

    @Override
    public boolean deleteEmpleado(String empleadoId) {
        // opción para poder borrar un empleado de la BBDD tanto de Soria como Teruel
        Empleados em = getEmpleado(empleadoId);
        if (em != null) {
            if (em.getSucursal().equals("Teruel")) {
                emTeruel.remove(em);
            } else {
                emSoria.remove(em);
            }
            return true;
        } else {
            return false;
        }

    }

    @Override
    public Empleados getEmpleado(String empleadoId) {
        // devolvemos la información de un empleado
        Empleados em = emTeruel.find(Empleados.class, empleadoId);
        if (em == null) {
            em = emSoria.find(Empleados.class, empleadoId);
        }
        return em;

    }

    @Override
    public List<Empleados> getAllEmpleados() {
        // devolvemos TODOS los empleados, tanto de Soria como de Teruel
        List<Empleados> lista = emTeruel.createNamedQuery("Empleado.getAll").getResultList();
        lista.addAll(emSoria.createNamedQuery("Empleado.getAll").getResultList());
        return lista;
    }

    @Override
    public List<Empleados> buscarPorSuc_Dep(String departamento, String sucursal) {
        List<Empleados> listaEmpleados;
        List<Empleados> listaEmpleadosAux;
        if ((!"".equals(departamento)) && (!"".equals(sucursal))) {//si ambos están rellenos
            /* se crea la query para buscar los empleados en función de la sucursal y el departamento
             * seleccionados en este caso y se devuelve la lista con las coincidencias
             */
            String ejbQL = "SELECT n FROM Empleados n WHERE n.Departamento LIKE ?1 AND n.Sucursal LIKE ?2";
            Query query = emTeruel.createQuery(ejbQL);
            query.setParameter(1, departamento);
            query.setParameter(2, sucursal);
            listaEmpleados = query.getResultList();
        } else if (("".equals(departamento)) && (!"".equals(sucursal))) { //si solo el dep
            /* se crea la query para buscar los empleados, pero en este caso solamente en función de la sucursal
             * pues el departamento está vacío. En este caso tendremos que ver si buscamos en Soria o Teruel, en
             * función de la sucursal seleccionada
             */
            String ejbQL = "SELECT n FROM Empleados n WHERE n.Sucursal LIKE ?1";
            Query query;
            if (sucursal.equalsIgnoreCase("Soria")) {
                query = emSoria.createQuery(ejbQL);
            } else {
                query = emTeruel.createQuery(ejbQL);
            }
            query.setParameter(1, sucursal);
            listaEmpleados = query.getResultList();
        } else if ((!"".equals(departamento)) && ("".equals(sucursal))) {//si sucursal vacía
            /* se crea la query para buscar los empleados, pero en este caso solamente en función del departamento
             * pues la sucursal está vacía. En este caso habrá que buscar en las DOS BBDD pues la gente de un
             * departamento en concreto no sabemos dónde está (Teruel o Soria)
             */
            String ejbQL = "SELECT n FROM Empleados n WHERE n.Departamento LIKE ?1";
            Query query = emTeruel.createQuery(ejbQL);
            query.setParameter(1, departamento);
            listaEmpleados = query.getResultList();

            String ejbQL2 = "SELECT n FROM Empleados n WHERE n.Departamento LIKE ?1";
            Query query2 = emSoria.createQuery(ejbQL2);
            query2.setParameter(1, departamento);
            listaEmpleadosAux = query2.getResultList();

            listaEmpleados.addAll(listaEmpleadosAux);

        } else { //si estan ambos vacios devolvemos todos los empleados
            listaEmpleados = getAllEmpleados();

        }
        return listaEmpleados;
    }
}
